package com.westos.userauth.service.impl;

import com.westos.userauth.dao.PartyGroupDao;
import com.westos.userauth.dao.PersonDao;
import com.westos.userauth.dao.UserLoginDao;
import com.westos.userauth.domain.PartyGroup;
import com.westos.userauth.domain.Person;
import com.westos.userauth.domain.UserLogin;
import com.westos.userauth.dto.UserInfoDTO;
import com.westos.userauth.dto.UserLoginDTO;
import com.westos.userauth.dto.UserLoginStatueDTO;
import com.westos.userauth.service.LoginService;
import com.westos.userauth.util.JwtUtils;
import com.westos.userauth.util.SecurityUtils;

import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/*
 * 姚建刚 孙秦浩
 * */
@Service
public class LoginServiceImpl implements LoginService {
    @Autowired
    private UserLoginDao userLoginDao;
    @Autowired
    private PartyGroupDao partyGroupDao;
    @Autowired
    private PersonDao personDao;

    private Logger logger = LoggerFactory.getLogger(LoginServiceImpl.class);

    @Override
    public UserLoginStatueDTO login(UserLoginDTO userLoginDTO) {
        //判断用户名是否为null
        UserLoginStatueDTO userLoginStatueDTO=new UserLoginStatueDTO();
        if(userLoginDTO.getUserLoginId()==null||userLoginDTO.getCurrentPassword()==null){
            //登录验证码为A0112表示用户名或密码为空或为null
            userLoginStatueDTO.setLoginStatusCode("A0112");
            userLoginStatueDTO.setLoginTime(new Date());
            return userLoginStatueDTO;
        }
        //判断用户名是否为“”
        if(userLoginDTO.getUserLoginId().equals("")||userLoginDTO.getCurrentPassword().equals("")){
            userLoginStatueDTO.setLoginStatusCode("A0112");
            userLoginStatueDTO.setLoginTime(new Date());
            return userLoginStatueDTO;
        }

        UserLogin userLogin = null;
        try {
            //调用dao层查询登录的用户信息
            userLogin = userLoginDao.queryById(userLoginDTO.getUserLoginId());
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("调用dao层queryUserInfoByUserId方法错误！！！");
        }
        //判断用户是否存在
        if (userLogin!=null){
            //校验密码
            if (SecurityUtils.md5(userLogin.getCurrentPassword()).equals(SecurityUtils.md5(userLoginDTO.getCurrentPassword()))){
                //如果上次登录密码校验没有失败
                if (userLogin.getDisabledDateTime()==null){
                    userLogin.setEnabled("0");
                }
                //判断此账号是否允许登录
                if ("1".equals(userLogin.getEnabled())){
                    if (((System.currentTimeMillis()-userLogin.getDisabledDateTime().getTime())/60000)<30){
                        //登录登录状态码为A0005表示不允许登录
                        userLoginStatueDTO.setLoginStatusCode("A0120");
                        userLoginStatueDTO.setMsg("您的账号"+userLogin.getUserLoginId()+"已经被锁定，请"+(30-(System.currentTimeMillis()-userLogin.getDisabledDateTime().getTime())/60000)+"分钟后再试!");
                        userLoginStatueDTO.setLoginTime(new Date());
                        userLoginStatueDTO.setFailures(userLogin.getSuccessiveFailedLogins());
                    }else {
                        //时间到了登录成功回复正常状态
                        userLogin.setEnabled("0");
                        userLogin.setSuccessiveFailedLogins(0l);
                    }
                }
                //判断此账号需不需要修改密码
                if ("true".equals(userLogin.getRequirePasswordChange())){
                    //登录登录状态码为A0123表示需要修改密码
                    userLoginStatueDTO.setLoginStatusCode("A0123");
                    userLoginStatueDTO.setLoginTime(new Date());
                }
                if ("0".equals(userLogin.getEnabled())){
                    //登录成功生成JWT token
                    String JWTToken = JwtUtils.geneJsonWebToken(userLoginDTO);
                    userLoginStatueDTO.setToken(JWTToken);
                    //登录成功状态码为00000表示一切ok
                    userLoginStatueDTO.setLoginStatusCode("00000");
                    userLoginStatueDTO.setLoginTime(new Date());
                    //登录成功归零失败次数
                    userLogin.setSuccessiveFailedLogins(0l);
                }
                try {
                    userLoginDao.updateUserLogin(userLogin);
                } catch (Exception e) {
                    e.printStackTrace();
                    logger.error("调用dao层updateUserLogin方法错误！！！");
                }
                return userLoginStatueDTO;
            }else {
                //登录登录状态码为A0120表示密码校验失败
                userLoginStatueDTO.setLoginStatusCode("A0120");
                userLoginStatueDTO.setLoginTime(new Date());

                //如果上次登录密码校验没有失败
                if (userLogin.getDisabledDateTime()==null){
                    userLogin.setDisabledDateTime(new Date());  //设置本次失败的失败时间
                    userLogin.setEnabled("0");                  //第一次登录失败不锁定
                    userLogin.setSuccessiveFailedLogins(1l);    //第一次失败的默认失败次数
                }
                //登录失败后记录登录次数 进行锁定
                //锁定时间（分钟）
                int min=(int) ((System.currentTimeMillis()-userLogin.getDisabledDateTime().getTime())/60000);
                switch (userLogin.getEnabled()){
                    case "1": //锁定
                        if (min<30){
                            userLoginStatueDTO.setMsg("您的账号"+userLogin.getUserLoginId()+"已经被锁定，请"+(30-min)+"分钟后再试!");
                        }else { //解锁并重置次数
                            userLogin.setEnabled("0");
                            userLogin.setSuccessiveFailedLogins(1L);
                        }
                        break;
                    case "0": //未锁定
                        //1分钟内频繁操作记录
                        if (min<1){
                            Long num= userLogin.getSuccessiveFailedLogins()+1;
                            if (num==5){
                                userLoginStatueDTO.setMsg("您的账号"+userLogin.getUserLoginId()+"已经被锁定，请"+30+"分钟后再试!");
                                userLogin.setEnabled("1");
                            }
                            userLogin.setSuccessiveFailedLogins(num);
                        }else {
                            //不是1分钟内频繁操作恢复默认失败登录次数为1
                            userLogin.setSuccessiveFailedLogins(1l);
                        }
                        userLogin.setDisabledDateTime(new Date());
                        break;
                    default:
                        break;
                }
                try {
                    userLoginDao.updateUserLogin(userLogin);
                } catch (Exception e) {
                    e.printStackTrace();
                    logger.error("调用dao层updateUserLogin方法错误！！！");
                }
                userLoginStatueDTO.setFailures(userLogin.getSuccessiveFailedLogins());
                return userLoginStatueDTO;
            }
        }else {
            //登录状态码为A0110表示用户名不存在
            userLoginStatueDTO.setLoginStatusCode("A0110");
            userLoginStatueDTO.setLoginTime(new Date());
            return userLoginStatueDTO;
        }
    }
    private boolean checkLogin(String nickName, String password) {

        return false;
    }

    @Override
    public Boolean logout(String token) {
        return null;
    }

    @Override
    public UserInfoDTO getLoginedUserinfo(String userId) {
        //判断用户名是否为空或者为null
        if (userId==null || "".equals(userId)){
            return null;
        }
        try {
            //调用dao层查询用户信息
            UserLogin userLogin = userLoginDao.queryById(userId);
            if (userLogin==null){
                return null;
            }else {
                UserInfoDTO userInfoDTO = new UserInfoDTO();
                userInfoDTO.setUserLoginId(userLogin.getUserLoginId());
                userInfoDTO.setCurrentPassword(SecurityUtils.md5(userLogin.getCurrentPassword()));
                userInfoDTO.setPartyId(userLogin.getPartyId());
                userInfoDTO.setSuccessiveFailedLogins(userLogin.getSuccessiveFailedLogins());
                //调用dao层查询组名
                PartyGroup partyGroup = partyGroupDao.selectPartyGroupById(userLogin.getPartyId());
                if (partyGroup!=null){
                    userInfoDTO.setGroupName(partyGroup.getGroupName());
                    return userInfoDTO;
                }else {
                    //没有查到组织名称就查找个人称呼
                    Person person = personDao.queryById(userLogin.getPartyId());
                    userInfoDTO.setFirstName(person.getFirstName());
                    return userInfoDTO;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("调用dao层queryUserInfoByUserId或selectPartyGroupById方法错误！！！ ");
            return null;
        }
    }

    public UserLoginDao getUserLoginDao() {
        return userLoginDao;
    }

    public void setUserLoginDao(UserLoginDao userLoginDao) {
        this.userLoginDao = userLoginDao;
    }

    public PartyGroupDao getPartyGroupDao() {
        return partyGroupDao;
    }

    public void setPartyGroupDao(PartyGroupDao partyGroupDao) {
        this.partyGroupDao = partyGroupDao;
    }

    public PersonDao getPersonDao() {
        return personDao;
    }

    public void setPersonDao(PersonDao personDao) {
        this.personDao = personDao;
    }
}
